package com.cz.mydao.wrapper;

import com.cz.mydao.constant.SqlKey;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @descriptions: 抽象条件封装类
 * @author: Joker.
 * @date: 2024/12/25 16:32
 * @version: 1.0
 */
@SuppressWarnings("unchecked")
public abstract class AbstractWrapper<T extends AbstractWrapper<T>> implements Wrapper {

    /**
     * 存储where条件
     */
    protected List<Condition> conditions = new ArrayList<>();

    /**
     * 添加等于条件
     *
     * @param column 列
     * @param value  值
     * @return 调用者本身
     */
    @Override
    public T eq(String column, Object value) {
        this.conditions.add(new Condition(column, value, "="));
        return (T) this;
    }

    /**
     * 添加Like条件
     *
     * @param column 列
     * @param value  值
     * @return 调用者本身
     */
    @Override
    public T like(String column, String value) {
        this.conditions.add(new Condition(column, value, "LIKE"));
        return (T) this;
    }

    /**
     * 添加IN条件
     *
     * @param field  字段
     * @param values 值集合
     * @return 调用者本身
     */
    @Override
    public T in(String field, List<Object> values) {
        this.conditions.add(new Condition(field, values, SqlKey.IN));
        return (T) this;
    }

    /**
     * 添加 between and 添加
     *
     * @param betweenField between字段
     * @param andField     and字段
     * @return 调用者本身
     */
    @Override
    public T between(String field, Object betweenField, Object andField) {
        this.conditions.add(new Condition(field, new ArrayList<>(Arrays.asList(betweenField, andField)), SqlKey.BETWEEN));
        return (T) this;
    }

    /**
     * 获取条件的值
     *
     * @return 值集合
     */
    @Override
    public List<Object> getValues() {
        List<Object> values = new ArrayList<>();
        for (Condition condition : conditions) {
            // 如果是in操作或者between操作
            if (SqlKey.IN.equals(condition.getOperator()) || SqlKey.BETWEEN.equals(condition.getOperator())) {
                // 需要获取多个字段值
                values.addAll(condition.getValues());
            } else {
                // 其他操作则只需获取单值
                values.add(condition.getValue());
            }
        }
        return values;
    }


    /**
     * 交给子类实现的SQL构建方法
     *
     * @param tableName 表名
     * @return sql语句
     */
    @Override
    public abstract String buildSql(String tableName);
}
